/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

/**
 *
 * @author RafaelGutierrez
 */
import cprincipal.*;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class HistorialMedicoXml {

    private Element root;
    private String fileLocation = "src/Archivos/HistorialMedico.xml";

    public HistorialMedicoXml() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    private Element HistorialtoXmlElement(HistorialMedico nHistorial) {

        Element Historialtrans = new Element("historialmedico");

            Element cedulapaciente = new Element("cedulapaciente");
                cedulapaciente.setText(Integer.toString(nHistorial.getCedulapaciente()));

            Element medicinascompradas = new Element("medicinascomprada");
                medicinascompradas.setText(nHistorial.getMedicinascompradas());

            Element medicinasrecetadas = new Element("medicinasrecetadas");
                medicinasrecetadas.setText(nHistorial.getMedicinasrecetas());


            Element fechaconsulta = new Element("fechaconsulta");
                fechaconsulta.setText(nHistorial.getFechaconsulta());


            Element hora = new Element("hora");
                hora.setText(nHistorial.getHora());

            Element operaciones = new Element("operaciones");
                operaciones.setText(nHistorial.getOperaciones());

            Element nombremedico = new Element("nombremedico");
                nombremedico.setText(nHistorial.getNombremedico());

            Element infraestructura = new Element("infraestructura");
                infraestructura.setText(nHistorial.getInfraestructura());


        Historialtrans.addContent(cedulapaciente);
        Historialtrans.addContent(medicinascompradas);
        Historialtrans.addContent(medicinasrecetadas);
        Historialtrans.addContent(fechaconsulta);
        Historialtrans.addContent(hora);
        Historialtrans.addContent(operaciones);
        Historialtrans.addContent(nombremedico);
        Historialtrans.addContent(infraestructura);

        return Historialtrans;
    }

    /*Método que retorna un Estudiante. A este metodo se le manda un Element y con
    sus datos se hará los pasos requeridos para crear el Estudiante*/
    private HistorialMedico HistorialtoObject(Element element) throws ParseException {
        HistorialMedico nHistorial = new HistorialMedico();

                nHistorial.setCedulapaciente(Integer.parseInt(element.getChildText("cedulapaciente")));
                nHistorial.setMedicinascompradas(element.getChildText("medicinascompradas"));
                nHistorial.setMedicinasrecetas(element.getChildText("medicinasrecetas"));
                nHistorial.setFechaconsulta(element.getChildText("fechaconsulta"));
                nHistorial.setHora(element.getChildText("hora"));
                nHistorial.setOperaciones(element.getChildText("operaciones"));
                nHistorial.setNombremedico(element.getChildText("nombremedico"));
                nHistorial.setInfraestructura(element.getChildText("infraestructura"));

        return nHistorial;
    }


    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

    public static Element buscar(List raiz, String dato) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
            if (dato.equals(e.getChild("cedulapaciente").getText())) {
                return e;
            }
        }
        return null;
    }

    public boolean agregarHistorial(HistorialMedico nHistorial) {
        boolean resultado = false;
        root.addContent(HistorialtoXmlElement(nHistorial));
        resultado = updateDocument();
        return resultado;
    }



    public HistorialMedico buscarHistorial(Integer cedula) {
        Element aux = new Element("cedulapaciente");
        List Historiales = this.root.getChildren("cedulapaciente");
        while (aux != null) {
            aux = HistorialMedicoXml.buscar(Historiales, Integer.toString(cedula));
            if (aux != null) {
                try {
                    return HistorialtoObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

    public boolean actualizarPaciente(HistorialMedico nHistorial) {
        boolean resultado = false;
        Element aux = new Element("paciente");
        List Historiales = this.root.getChildren("paciente");
        while (aux != null) {
            aux = PacienteXml.buscar(Historiales, Integer.toString(nHistorial.getCedulapaciente()));
            if (aux != null) {
                Historiales.remove(aux);
                resultado = updateDocument();
            }
        }
        agregarHistorial(nHistorial);
        return resultado;
    }

    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
//    public boolean borrarPaciente(Integer cedula) {
//        boolean resultado = false;
//        Element aux = new Element("paciente");
//        List Pacientes = this.root.getChildren("paciente");
//        while (aux != null) {
//            aux = PacienteXml.buscar(Pacientes, String.valueOf(cedula));
//            if (aux != null) {
//                Pacientes.remove(aux);
//                resultado = updateDocument();
//            }
//        }
//        return resultado;
//    }


    /* Para obtener todos los Estudiantes
     * @return ArrayList con todos los objetos Estudiante  */
    public ArrayList<HistorialMedico> todoslosdoctores() {
        ArrayList<HistorialMedico> resultado = new ArrayList<HistorialMedico>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(HistorialtoObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}
